package br.ufms.odontologico.control;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.ufms.odontologico.bo.AtendimentoBO;
import br.ufms.odontologico.bo.ClienteBO;
import br.ufms.odontologico.bo.MaterialBO;
import br.ufms.odontologico.bo.OrcamentoBO;
import br.ufms.odontologico.bo.ServicoBO;
import br.ufms.odontologico.model.Agendamento;
import br.ufms.odontologico.model.Atendimento;
import br.ufms.odontologico.model.AtendimentoItemMaterial;
import br.ufms.odontologico.model.AtendimentoItemServico;
import br.ufms.odontologico.model.Cliente;
import br.ufms.odontologico.model.Material;
import br.ufms.odontologico.model.Orcamento;
import br.ufms.odontologico.model.Servico;

@ManagedBean
@ViewScoped
public class AtendimentoControl {
	private List<Cliente> listaDeClientes;
	private List<Material> materiaisDisponiveis;
	private List<Servico> servicosDisponiveis;

	private Atendimento atendimento;
	private Material material;
	private Servico servico;
	private Integer sQuantidade = 0;
	private Integer mQuantidade = 0;
	private List<Agendamento> agendamentos;
	private List<Atendimento> atendimentos;
	private List<Orcamento> orcamentos;

	@ManagedProperty("#{clienteBO}")
	private ClienteBO clienteBO;

	@ManagedProperty("#{materialBO}")
	private MaterialBO materialBO;

	@ManagedProperty("#{servicoBO}")
	private ServicoBO servicoBO;

	@ManagedProperty("#{orcamentoBO}")
	private OrcamentoBO orcamentoBO;

	@ManagedProperty("#{atendimentoBO}")
	private AtendimentoBO atendimentoBO;

	@PostConstruct
	public void inializar() {
		setListaDeClientes(new ArrayList<Cliente>());
		setAtendimento(new Atendimento());
		getAtendimento().setMateriais(new ArrayList<AtendimentoItemMaterial>());
		getAtendimento().setServicos(new ArrayList<AtendimentoItemServico>());
	}

	public void carregarCliente() {
		atendimentos = getAtendimentoBO().listByCliente(
				getAtendimento().getCliente());
		agendamentos = getClienteBO().getAgendamentos(getAtendimento().getCliente());
	}

	public List<Cliente> listarClientesPorNome(String nome) {
		listaDeClientes = clienteBO.listByNome(nome);
		return getListaDeClientes();
	}

	public List<Servico> listarServicosPorNome(String nome) {
		servicosDisponiveis = getServicoBO().listByNome(nome);
		return servicosDisponiveis;
	}

	public List<Material> listarMateriaisPorNome(String nome) {
		materiaisDisponiveis = materialBO.listByNome(nome);
		return materiaisDisponiveis;
	}
	
	public Float getTotalGeral(){
		Float res = 0F;
		if(atendimento!=null){
			res = atendimento.getTotalMaterial()+atendimento.getTotalServico();
		}
		return res;
	}
	public void carregarDadosCliente() {

	}
	
	public void vincular(Agendamento age){
		this.atendimento.setAgendamento(age);
	}
	public void adicionarServico() {
		AtendimentoItemServico ate = new AtendimentoItemServico();
		ate.setServico(servico);
		ate.setQuantidade(sQuantidade);
		ate.setPrecoUnitario(servico.getPrecoUnitario());
		atendimento.getServicos().add(ate);
	}
	public void removerServico(AtendimentoItemServico servico){
		atendimento.getServicos().remove(servico);
	}

	public void adicionarMaterial() {
		AtendimentoItemMaterial ate = new AtendimentoItemMaterial();
		ate.setMaterial(material);
		ate.setQuantidade(mQuantidade);
		ate.setPrecoUnitario(material.getPrecoUnitario());
		atendimento.getMateriais().add(ate);
	}

	public void removerMaterial(AtendimentoItemMaterial material){
		atendimento.getMateriais().remove(material);
	}
	
	// *********** Getters e Setters
	public List<Cliente> getListaDeClientes() {
		return listaDeClientes;
	}

	public void setListaDeClientes(List<Cliente> listaDeClientes) {
		this.listaDeClientes = listaDeClientes;
	}

	public List<Material> getMateriaisDisponiveis() {
		return materiaisDisponiveis;
	}

	public void setMateriaisDisponiveis(List<Material> materiaisDisponiveis) {
		this.materiaisDisponiveis = materiaisDisponiveis;
	}

	public List<Servico> getServicosDisponiveis() {
		return servicosDisponiveis;
	}

	public void setServicosDisponiveis(List<Servico> servicosDisponiveis) {
		this.servicosDisponiveis = servicosDisponiveis;
	}

	public ClienteBO getClienteBO() {
		return clienteBO;
	}

	public void setClienteBO(ClienteBO clienteBO) {
		this.clienteBO = clienteBO;
	}

	public MaterialBO getMaterialBO() {
		return materialBO;
	}

	public void setMaterialBO(MaterialBO materialBO) {
		this.materialBO = materialBO;
	}

	public OrcamentoBO getOrcamentoBO() {
		return orcamentoBO;
	}

	public void setOrcamentoBO(OrcamentoBO orcamentoBO) {
		this.orcamentoBO = orcamentoBO;
	}

	public ServicoBO getServicoBO() {
		return servicoBO;
	}

	public void setServicoBO(ServicoBO servicoBO) {
		this.servicoBO = servicoBO;
	}

	public Atendimento getAtendimento() {
		return atendimento;
	}

	public void setAtendimento(Atendimento atendimento) {
		this.atendimento = atendimento;
	}

	public List<Atendimento> getAtendimentos() {
		return atendimentos;
	}

	public void setAtendimentos(List<Atendimento> atendimentos) {
		this.atendimentos = atendimentos;
	}

	public List<Orcamento> getOrcamentos() {
		return orcamentos;
	}

	public void setOrcamentos(List<Orcamento> orcamentos) {
		this.orcamentos = orcamentos;
	}

	public AtendimentoBO getAtendimentoBO() {
		return atendimentoBO;
	}

	public void setAtendimentoBO(AtendimentoBO atendimentoBO) {
		this.atendimentoBO = atendimentoBO;
	}

	public Servico getServico() {
		return servico;
	}

	public void setServico(Servico servico) {
		this.servico = servico;
	}

	public Material getMaterial() {
		return material;
	}

	public void setMaterial(Material material) {
		this.material = material;
	}

	public Integer getmQuantidade() {
		return mQuantidade;
	}

	public void setmQuantidade(Integer mQuantidade) {
		this.mQuantidade = mQuantidade;
	}

	public Integer getsQuantidade() {
		return sQuantidade;
	}

	public void setsQuantidade(Integer sQuantidade) {
		this.sQuantidade = sQuantidade;
	}

	public List<Agendamento> getAgendamentos() {
		return agendamentos;
	}

	public void setAgendamentos(List<Agendamento> agendamentos) {
		this.agendamentos = agendamentos;
	}

}
